package com.komorebishao.code;

import java.util.Arrays;

public class Code27 {
    /**
     * String args[ ]或者String[ ] args表示给主方法传一个字符串数组. 而args是一个字符串数组的变量名，不是关键字，是arguments的缩写，只是一个默认名，一般都习惯性照写.
     * String[] args是main函数的形式参数，，可以用来获取命令行用户输入进去的参数。如果你是java的初学者，编写一些简单的小程序是用不到它的，但是你在写程序的时候不管用的到用不到，声明main函数的时候一定要在括号里写上它，否则会报错。
     * 我再给你举个用到String[] args的例子，可能语法上有错误，因为我手边没有java的书，而且我也只是个本科生，水平有限，权当给你理解用。
     * class Example
     * {
     * public void main(String[] args)
     * {
     * System.out.println(args[0]);
     * System.out.println(args[1]);
     * }
     * }
     * 那么这个程序在执行的时候就需要向main函数传递形式参数的值，好让main函数完成打印的功能。
     * 注：String[] args显示args是一个String类型的数组，args[0]、args[1]是头两个元素。
     * 上面那个小程序执行的时候是这样：
     * 首先，和其他的java程序一样，在命令提示符那个框框里输入
     * javac Example.java
     * 再输入
     * java Example straul good
     * 后面两个字符串随便写什么，它们作为实参传入main函数，straul传入args[0]，good传入args[1]。
     * 那么屏幕会出现：
     * straul
     * good
     * 这和在main函数里调用其他函数并且向被调用函数传递参数是一样的道理，只不过传给main函数罢了。
     * @param args
     */
    public static void main(String[] args) {
        int[] input = new int[] {3, 2, 2, 3};
        int val = 3;
        Code27 code27 = new Code27();
        int resultSize = code27.removeElement(input, val);
        int[] result = java.util.Arrays.copyOf(input, resultSize);

        System.out.println(Arrays.toString(result));
    }

    public int removeElement(int[] nums, int val) {
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.length; fastIndex ++) {
            if (nums[fastIndex] != val) {
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        return slowIndex;
    }
}
